import numpy as np
import matplotlib.pyplot as plt

# 定义绘图范围和网格点数
m = 5
x = np.linspace(-m, m, 15)  # 在x轴上生成从-m到m的15个等间距点
y = np.linspace(-m, m, 15)  # 在y轴上生成从-m到m的15个等间距点
[X, Y] = np.meshgrid(x, y)  # 创建X-Y坐标网格

# 动力系统的系数矩阵A
A = [1, 1, -1, 1]  # 系统的线性化矩阵元素
[a, b, c, d] = A  # 分别对应dx/dt和dy/dt中的系数

# 计算速度场U,V在每个网格点上的值
U = a*X + b*Y  # dx/dt的值域
V = c*X + d*Y  # dy/dt的值域
C = (X**2 + Y**2)/np.max(X**2 + Y**2)  # 用于颜色映射的速度场强度

# 创建图形并绘制向量场
fig, ax = plt.subplots()  # 创建一个新的图表
ax.quiver(X, Y, U, V, C)  # 绘制向量场，用颜色表示速度大小
ax.set_xticks([])  # 隐藏x轴刻度
ax.set_yticks([])  # 隐藏y轴刻度
ax.set_aspect('equal')  # 设置x轴和y轴的比例相同

# 根据通解公式计算轨迹，并绘制多个不同初始条件下的轨迹
t = np.linspace(-10, 10, 101)  # 时间变量t的取值范围
for C1 in [-0.5, -0.3, 0, 0.3, 0.5]:  # 循环遍历不同的C1值
    for C2 in [-0.5, -0.3, 0, 0.3, 0.5]:  # 循环遍历不同的C2值
        xg = C1*np.exp(t)*np.cos(t) + C2*np.exp(t)*np.sin(t)  # x方向的轨迹方程
        yg = -C1*np.exp(t)*np.sin(t) + C2*np.exp(t)*np.cos(t)  # y方向的轨迹方程
        ax.plot(xg, yg, '-')  # 绘制轨迹线

# 设置图形显示范围
ax.set_xlim(-m, m)  # 设置x轴显示范围
ax.set_ylim(-m, m)  # 设置y轴显示范围

# plt.show()  # 显示图形